﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Bastanteo.Persistencia;
using Bastanteo.Domain;
using NUnit.Framework;
using Bastanteo.Negocio;

namespace Bastanteo.Tests
{
    [TestFixture]
    public class TestBastanteo
    {
        BastanteoBL dao = null;
        ClienteBL daocliente = null;
        GrupoBL daoGrupo = null;
        PoderesBL daoPoder = null;
        

        Bastanteos creado = null;
        Bastanteos BastanteosaCrear = new Bastanteos();
        Bastanteos BastanteosObtenido = null;

        [TestFixtureSetUp]
        public void InicializarPruebas()
        {

            daocliente = new Bastanteo.Negocio.ClienteBL();
            daocliente.RegistrarCliente("40943615", "1040943615", "hym", DateTime.Now, "SA", 100);
            daoGrupo = new Bastanteo.Negocio.GrupoBL();
            daoGrupo.RegistrarCargo(1, "Grupo1");
            daoPoder = new Bastanteo.Negocio.PoderesBL();
            daoPoder.RegistrarPoder("P01", "DEPOSITO", 1, "DEP", "uno");

            dao = new Bastanteo.Negocio.BastanteoBL();
            
            BastanteosaCrear.BastanteoId = 1;
            BastanteosaCrear.ClienteId = "40943615";
            BastanteosaCrear.PoderesId = "P01";
            BastanteosaCrear.BastanteoForma = "A";
            
            BastanteosaCrear.BastanteoLimite = Convert.ToDouble(100.00);
            BastanteosaCrear.BastanteoVigencia = DateTime.Now;
            BastanteosaCrear.GrupoId = 1;

        }


        [Test]
        public void Test1_CrearBastanteo()
        {
            // - Validar que ocurra un error al intentar crear un Bastanteo con un campo nulo
            
            Assert.Catch<Exception>(delegate
            {
                creado = dao.RegistrarBastanteo(BastanteosaCrear.BastanteoId, BastanteosaCrear.ClienteId , BastanteosaCrear.PoderesId, BastanteosaCrear.GrupoId, BastanteosaCrear.BastanteoForma, BastanteosaCrear.BastanteoCombinacion, BastanteosaCrear.BastanteoLimite, BastanteosaCrear.BastanteoVigencia );
            });
            BastanteosaCrear.BastanteoCombinacion = "AB";
            ////creado.Grupo = "A";
            


            // - Validar que se cree un Bastanteo correctamente (sin error)
            Assert.DoesNotThrow(delegate
            {
            creado = dao.RegistrarBastanteo(BastanteosaCrear.BastanteoId, BastanteosaCrear.ClienteId, BastanteosaCrear.PoderesId, BastanteosaCrear.GrupoId, BastanteosaCrear.BastanteoForma, BastanteosaCrear.BastanteoCombinacion, BastanteosaCrear.BastanteoLimite, BastanteosaCrear.BastanteoVigencia);
            });

            // - Validar que el Bastanteo creado no sea nulo, tenga el id y el grupo ingresados

            Assert.IsNotNull(creado);
            Assert.AreEqual(creado.BastanteoId , BastanteosaCrear.BastanteoId );
            Assert.AreEqual(creado.GrupoId, BastanteosaCrear.GrupoId);

        }

        [Test]
        public void Test2_ObtenerBastanteo()
        {
            
            // - Validar que se retorne nulo al obtener un Bastanteo que no existe
            Assert.DoesNotThrow(delegate
            {
                BastanteosObtenido = dao.ObtenerBastanteoPorId(creado.BastanteoId);
            });
            Assert.IsNotNull(BastanteosObtenido);
            // - Validar que se obtenga el Bastanteo creado satisfactoriamente en el Test1 (que no sea nulo)
            Assert.DoesNotThrow(delegate
            {
                BastanteosObtenido = dao.ObtenerBastanteoPorId(creado.BastanteoId);
            });
            Assert.IsNotNull(BastanteosObtenido);
            // - Validar que el id del bastanteo obtenido sea el registrado anteriormente
            Assert.AreEqual(BastanteosObtenido.BastanteoId , creado.BastanteoId );

        }


        [Test]
        public void Test3_EliminarBastanteo()
        {

            //LANZA EXCEPTION CUANDO SE TRATA DE ELIMINAR UN PODER CON BASTANTEO.
            Assert.Catch<Exception>(delegate
            {
                daoPoder.EliminarPoderPorId("PO1");
            });

           


            Bastanteos bastanteosaEliminar = dao.ObtenerBastanteoPorId(creado.BastanteoId);
            // - Validar que ocurre un error si se intenta eliminar un bastanteo nulo
            Assert.Catch<Exception>(delegate
            {
                dao.EliminarBastanteoPorId(0);
            });
            // - Validar que se elimina correctamente el bastanteo creado previamente
            Assert.DoesNotThrow(delegate
            {
                dao.EliminarBastanteoPorId(bastanteosaEliminar.BastanteoId);
            });
            // - Validar que luego de eliminado se retorne nulo al obtenerlo de nuevo
            Bastanteos bastanteosEliminado = dao.ObtenerBastanteoPorId(creado.BastanteoId);
            Assert.IsNull(bastanteosEliminado);
            

        }

        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            //dao.EliminarBastanteoPorId(1);
            daocliente.EliminarClientePorId("40943615");
            daoGrupo.EliminarGrupoPorId(1);
            daoPoder.EliminarPoderPorId("P01");
            //Assert.Catch<Exception>(delegate
            //{
            //    throw new Exception("PODER ELIMINADO OK");
            //});
            //global::System.Windows.Forms.MessageBox.Show("Test");
            System.Console.WriteLine("Eliminado Ok");
        }


    }

}